ART能将dex指令编译为native代码。就ART虚拟机而言,它的编译优化器的输入是APK中的dex字节码,输出是优化后的HInstruction(ART中的IR)。在编译时,可以进行优化工作。优化工作也是通过一个个Pass进行的。

将.dex文件解析为CFG

ART将.dex文件中一个Java函数解析为CFG的代码在block_builder.cc->HBasicBlockBuilder::Build()中。

解析完成后,可以建立一个函数的CFG。得到一个HGraph对象,bb存放在HGraphblocks中,为HBasicBlock。可以借助HBasicBlocksuccessors_predcessors_成员访问bb的前驱和后继。

在CFG上构建dominator tree

TODO

将dex字节码转换为HInstruction(IR)

instruction_builder.cc->HInstructionBuilder::Build()在整理好的CFG上工作,通过RPO(逆后序遍历)遍历CFG上的bb,将bb中的dex字节码转化为HInstruction。至于使用RPO的原因,是其有性质:在遍历到节点V时V的前驱一定已经被遍历完。 ART IR构造完毕后,SSA的PHI函数也相应得到添加。但对SSA而言,这个处理是比较简单和粗糙的,所以ART优化器在优化之前的最后一步是调用SsaBuilder的Build函数以对SSA进行更进一步的处理,然后将CFG设置其SSA标志以表示CFG的SSA改造完成。构造SSA的函数位于:ssa_builder.cc->SsaBuilder::BuildSsa()

在SSA IR上执行优化

即执行各种Pass